﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iNet
{
	/// <summary>
	/// 帶有標籤的物件。
	/// </summary>
	/// <typeparam name="TObj">物件型別。</typeparam>
	/// <typeparam name="TTag">標籤型別。</typeparam>
	public class TaggedObject<TObj, TTag>
	{
		#region 建構子
		/// <summary>
		/// 初始化新的 TaggedObject 執行個體。
		/// </summary>
		public TaggedObject()
		{ }
		/// <summary>
		/// 初始化新的 TaggedObject 執行個體。
		/// </summary>
		/// <param name="obj">物件。</param>
		public TaggedObject(TObj obj)
			: this(obj, default(TTag))
		{ }
		/// <summary>
		/// 初始化新的 TaggedObject 執行個體。
		/// </summary>
		/// <param name="obj">物件。</param>
		/// <param name="tag">標籤。</param>
		public TaggedObject(TObj obj, TTag tag)
		{
			this.Object = obj;
			this.Tag = tag;
		}
		#endregion
		#region explicit operator
		public static explicit operator TObj(TaggedObject<TObj, TTag> taggedObj)
		{
			return taggedObj.Object;
		}
		#endregion
		#region implicit operator
		public static implicit operator TaggedObject<TObj, TTag>(TObj obj)
		{
			return new TaggedObject<TObj, TTag>(obj);
		}
		#endregion
		#region Object
		/// <summary>
		/// 取得或設定物件。
		/// </summary>
		public TObj Object { get; set; }
		#endregion
		#region Tag
		/// <summary>
		/// 取得或設定標籤。
		/// </summary>
		public TTag Tag { get; set; }
		#endregion
	}
}
